package c05面向对象;

import java.lang.ref.*;

public class 引用类型之虚引用的探究 {
	public static void main(String[] args)
			throws Exception {
		//创建一个字符串对象
		String str = new String("疯狂Java讲义");
		//创建一个引用队列
		ReferenceQueue rq = new ReferenceQueue();
		//创建一个虚引用，让此虚引用引用到"疯狂Java讲义"字符串
		PhantomReference pr = new PhantomReference(str, rq);//虚引用不能单独使用，必须结合引用队列使用！
		System.err.println(pr.get());  //一样是null！
		System.err.println(rq.poll() == pr);   //还没有引用进入引用队列！
		//切断str引用和"疯狂Java讲义"字符串之间的引用
		str = null;
		//取出虚引用所引用的对象，
		//并不能通过虚引用访问被引用的对象，所以此处输出null
		System.err.println(pr.get());  //①
		//强制垃圾回收
		System.gc();
		System.runFinalization();
		//垃圾回收之后，虚引用将被放入引用队列中
		//取出引用队列中最先进入队列中的引用与pr进行比较
		System.err.println(rq.poll() == pr);   //②
	}
}
